package utilities;

import java.util.List;
import java.util.Map;

public interface Archive {
	
	// Put methods
	/**
	 * Puts a String class name, with a String key
	 */
	public void putClassName(String key, String className);
	
	/**
	 * Puts a String attribute, with a String key
	 */
	public void putAttribute(String key, String value);

	/**
	 * Puts an array of Strings, with a String key
	 */
	public void putAttributeList(String key, List<String> value);

	/**
	 * Puts an Archiveable object, with a String key
	 */
	public void putOneRelationship(String key, Archiveable value);

	/**
	 * Put a List of Archiveable objects, with a String key
	 */
	public void putManyRelationship(String key, List<? extends Archiveable> value);
	
	/**
	 * Put a Map of Java Primitives-Primitives, with a String key
	 */
	public void putPrimitiveToPrimitiveMap(String key, Map<String, String> map);
	
	/**
	 * Put a Map of Java Primitives-Archiveables, with a String key
	 */
	public void putPrimitiveToArchiveableMap(String key, Map<String, ? extends Archiveable> map);
	
	/**
	 * Put a Map of Archiveables-Archiveables, with a String key
	 */
	public void putArchiveableToArchiveableMap(String key, Map<? extends Archiveable, ? extends Archiveable> map);
	
	
	// Get methods
	/**
	 * Returns the String class name for the specified String key
	 */
	public String getClassName(String key);
	
	/**
	 * Returns the String attribute for the specified String key
	 */
	public String getAttribute(String key);

	/**
	 * Returns the List of Strings for the specified String key
	 */
	public List<String> getAttributeList(String key);

	/**
	 * Returns the Archive of the object for the specified String key
	 */
	public Archive getOneRelationship(String key);

	/**
	 * Returns the List of Archives for the specified String key
	 */
	public List<Archive> getManyRelationship(String key);
	
	/**
	 * Returns the Map of Java Primitives-Primitives for the specified String key
	 */
	public Map<String, String> getPrimitiveToPrimitiveMap(String key);
	
	/**
	 * Returns the Map of Java Primitives-Archiveables for the specified String key
	 */
	public Map<String, Archive> getPrimitiveToArchiveableMap(String key);
	
	/**
	 * Returns the Map of Archiveables-Archiveables for the specified String key
	 */
	public Map<Archive, Archive> getArchiveableToArchiveableMap(String key);
	
}
